package cn.jly.spring.boot.cloud.exhandler;

import cn.jly.spring.boot.cloud.beans.User;
import cn.jly.spring.boot.cloud.dao.UserRepository;
import cn.jly.spring.boot.cloud.utils.ResultBase;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.function.Supplier;

/**
 * @ControllerAdvice搭配不同注解的三大作用：
 * 1. 全局异常处理
 * 2. 全局数据绑定
 * 3. 全局数据预处理
 *
 * @author lanyangji
 * @description 自定义全局异常处理器
 * @date 2020/11/24 上午 11:05
 */
@Slf4j
@ControllerAdvice
public class MainExceptionHandler {

    @Autowired
    UserRepository userRepository;

    /**
     * 全局异常处理
     *
     * @param ex
     * @return
     */
    @ResponseBody
    @ExceptionHandler(Exception.class)
    public ResultBase handleException(Exception ex) {
        log.error("捕获到异常 -> {}", ex.getMessage());

        // 自定义处理逻辑
        return ResultBase.build(HttpStatus.BAD_REQUEST.value(), ex.getMessage(), null);
    }

    /**
     * 全局数据绑定
     *
     * 注意：该方法在每一次controller请求之前都会执行，谨慎使用
     *
     * @return
     */
    @ModelAttribute(name = "beautyMap")
    public Map<String, Object> myData() {
        final HashMap<String, Object> map = new HashMap<>();
        map.put("beautyName", "wht");
        map.put("beautyName2", "wt");
        map.put("beautyName3", "zxr");

        final Optional<User> userOptional = userRepository.findById(1L);
        map.put("user", userOptional.orElseGet(new Supplier<User>() {
            @Override
            public User get() {
                return User.builder().username("zxr").build();
            }
        }));

        log.info("绑定全局数据 -> " + map);
        return map;
    }
}
